package com.java.socket;

import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;


/**
 * 基于TCP协议的Socket通信，实现用户登陆
 * 服务端
 * 
 * 步骤：
 * 1.创建ServerSocket对象，绑定监听端口
 * 2.通过accept()方法监听客户端请求
 * 3.连接建立后，通过输入流读取客户端发送的请求信息
 * 4.通过输出流向客户端发送响应信息；
 * 5.关闭相关资源；
 * 
 * 多线程服务器
 * （应用多线程实现服务器与多客户端之间通讯）
 * 1.服务器端创建ServerSocket，循环调用accept()等待客户端连接；
 * 2.客户端创建一个socket并请求和服务器端连接；
 * 3.服务器端接收客户端请求，创建socket与该客户建立专线连接；
 * 4.建立连接的两个socket在一个单独的线程上对话；
 * 5.服务器端继续等待新的连接；
 * 
 * @author jinmingwu
 *
 */

public class ServerDemo {

	private static ServerSocket serverSocket;

	public static void main(String[] args) {
		try {
			serverSocket = new ServerSocket(8888);
			Socket socket = null;
			
			//记录客户端的数量
			int count = 0;
			System.out.println("===服务器即将启动，等待客户端的连接===");
			
			//循环监听等待客户端的连接
			while(true) {
				//2.调用accept()方法开始监听，等待客户端的连接
				socket = serverSocket.accept();
				
				//创建一个新的线程
				ServerThread serverThread = new ServerThread(socket);
				
				//启动线程
				serverThread.start();
				
				count++;
				System.out.println("客户端的数量：" + count);
				
				InetAddress address = socket.getInetAddress();
				System.out.println("当前客户端的IP：" + address.getHostAddress());
			}

//			//3.获取输入流，并获取客户端信息
//			InputStream is = socket.getInputStream();	//字节输入流
//			InputStreamReader isr = new InputStreamReader(is); //将字节流转换成字符流
//			BufferedReader br = new BufferedReader(isr);	//为输入流添加缓冲
//			String info = null;
//			while((info = br.readLine()) != null) {
//				System.out.println("接收到客户端的信息：" + info);
//			}
//			socket.shutdownInput();//关闭输入流
//
//			//4.获取输出流，响应客户端的请求
//			OutputStream os = socket.getOutputStream();
//			PrintWriter pw = new PrintWriter(os);
//			pw.write("欢迎你！");
//			pw.flush();//刷新缓冲
//
//			//5.关闭资源
//			is.close();
//			isr.close();
//			br.close();
//
//			pw.close();
//			os.close();
//
//			socket.close();
//			serverSocket.close();


		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
